// 实体类, 表结构 + 模型 角色权限表
let mongoose = require('mongoose')

// 定义权限表结构
let Schema = mongoose.Schema
let ObjectId = Schema.Types.ObjectId

let RolePowerSchema = Schema({
    //关于某个角色，可以ObjectId拿到角色的其他字段
    roleId: {
        type: ObjectId,
        ref: 'Role'
    },
    // 关于某个权限,通过ObjectId拿到权限的其他字段
    powerId: {
        type: ObjectId,
        ref: 'Power'
    }
}, {
    versionKey: false   // 查询数据库时,忽略_v的字段返回
})

// 为模式添加静态方法, 不会与数据库进行交互, 只有在模型实例化编译后产生作用
// 通过模型调用
RolePowerSchema.statics = {
    findByRoleId: function (id) {
        return this.find({
            roleId: id
        })
    },
    getPowerEntityByRoleId: function (rid) {
        return this.find({
            roleId: rid
        }, {
            roleId: 0,
            _id: 0
        }).populate({
            path: 'powerId',
            select: {name: 1, parentId: 1, location: 1}
        }).then(farr => {
            let farray = farr.map(item => {
                return item.powerId
            })
            return Promise.resolve(farray)
        }).catch(err => {
            return Promise.reject()
        })
    },
    insert: function (rid, fids) {
        if (fids && fids.length) {
            let fidsArray = []
            for (let i = 0; i< fids.length;i++) {
                fidsArray.push({
                    roleId: rid, powerId: fids
                })
            }
            return this.insertMany(fidsArray)
        } else {
            return Promise.reject('角色权限关系未选择')
        }
    },
    removeByRoleId: function (id) {
        return this.remove({
            roleId: id
        })
    },
    removeByPowerId: function (fid) {
        return this.remove({
            powerId: fid
        })
    }
}

//编译生成Role模型，并将模型构造函数导出
module.exports = mongoose.model('RolePower', RolePowerSchema)
